import axios from 'axios';
import { setToken, getToken } from '@/libs/util'
// import router from '../../router'

/**
 * 初始化请求的封装
 * @author lautin
 * @created 2019-11-21 14:54:43
 */

import {
    Message,
    Loading
} from 'element-ui'

// 加入状态管理
// import store from '../../store'

// 加入进度条
// import NProgress from 'nprogress' // nprogress插件
// import 'nprogress/nprogress.css'  // nprogress样式(必须)

// 加载惯例配置
import settings from './conventions';

// 初始化配置
Object.assign(settings, {

    // api请求根地址 打包使用完整地址 调试使用本地服务器代理 避免跨域
    // baseURL: process.env.NODE_ENV == 'production' ? 'http://47.57.245.127/api' : '/api',

    baseURL: '/api',

    // 加载超时限定5s
    timeout: 15000,

    headers: {
        "Authorization": "Bearer " + getToken("token"),
        "from": "pc",
        'lang': 'zh-CN',
    },

    // transformRequest: [function (data, headers) {
    //     debugger
    //     // 此处写下你想如何转化数据
    //     return data;
    // }],

});


// 创建服务请求对象
const server = axios.create(settings);

let loading = null;

// request拦截器
server.interceptors.request.use(

    config => {
         
        // 配置了loading 且没有开启的loading
        if (!loading && config.hideloading !== true) {  // undefined -> loading,
                                                        // true -> hideLoading
            loading = Loading.service({
                lock: true,
                text: '拼命加载中...',
                // spinner: 'el-icon-loading',
                background: 'rgba(0, 0, 0, 0.5)'
            });

        }

        return config;

    },

    error => {
        // debugger
        return Promise.reject(error);
    }

)

// response拦截器
server.interceptors.response.use(

    // 请求成功
    response => {

        // 如果有加载的loading则关闭
        if (loading) {
            loading.close();
            loading = null;
        }

        let { status_code, message, data } = response.data;

        // 业务逻辑错误
        if (status_code != 200) {

            switch (status_code) {
                case 401: // 登陆失效
                    localStorage.removeItem('token');
                    // router.replace('/login');
                    location.href = '/login';
                    break;
                // case 500: // 参数出错
                //     message = "请求发生错误!";
                //     break;
                default: // 通用错误提示

            }

            Message({
                type: 'error',
                duration: 2 * 1000,
                message,
            });

            // 进入catch
            throw new Error(message);

        }

        return data;

    },

    // 请求错误
    error => {

        if (loading) loading.close();

        let message;
        if (error.message.includes("timeout")) {
            message = "连接超时，请稍后再试！";
        } else {
            message = error.message;
        }

        // 错误提示
        Message({
            type: 'error',
            duration: 2 * 1000,
            message,
            callback() {
                // 进入catch
                throw new Error(error);
            }
        });
    }
)

// request方法中的配置会合并到server中
export default server;